package is1;

import java.io.File;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.NamedNodeMap;

public class EntradaXML implements Entrada 
{
	private ArrayList<Command> comandos;
	private static EntradaXML uniqueInstance = null;
	
	private EntradaXML()
	{
		comandos = new ArrayList<Command>();
	}
	
	public static EntradaXML getInstance()
	{
		if (uniqueInstance == null)
		{
			uniqueInstance = new EntradaXML();
		}
		
		return uniqueInstance;
	}
	
	private boolean getComandos(String origen)
	{
		File file;
		DocumentBuilderFactory dbf;
		DocumentBuilder db;
		Document doc;
		Element venta;
		Node hijo;
		NodeList hijos;
		NamedNodeMap atributos;
		int numNodos;
		String nombreComando;
		
		try 
		{
			file = new File(origen);
			dbf = DocumentBuilderFactory.newInstance();
			db = dbf.newDocumentBuilder();
			doc = db.parse(file);
			doc.getDocumentElement().normalize();
			venta = doc.getDocumentElement();
			// Eliminar los nodos #text del DOM si existen.
			for (int i = 0; i < venta.getChildNodes().getLength(); i++)
			{
				hijo = venta.getChildNodes().item(i);
				
				if (hijo.getNodeName().equals("#text"))
				{
					venta.removeChild(hijo);
					i--;
				}
			}
			
			comandos.clear();
			hijos = venta.getChildNodes();	
			numNodos = hijos.getLength();
			
			for (int i = 0; i < numNodos; i++)
			{
				hijo = hijos.item(i);
				nombreComando = hijo.getNodeName();
				atributos = hijo.getAttributes();
				
				if (nombreComando.equals("linventa"))
				{
					comandos.add(new NewLineCommand(atributos.getNamedItem("codProd").getNodeValue(), atributos.getNamedItem("cant").getNodeValue()));
				}
				else if(nombreComando.equals("cancelarVenta") || nombreComando.equals("cancelarventa"))
				{
					comandos.add(new CancelCommand());
					break;
				}
				else if(nombreComando.equals("deshacerLinVenta") || nombreComando.equals("deshacerlinventa"))
				{
					comandos.add(new UndoLineCommand());
				}
				else if(nombreComando.equals("fecha"))
				{
					comandos.add(new NewDateCommand(atributos.getNamedItem("dia").getNodeValue(), atributos.getNamedItem("hora").getNodeValue()));
				}
				else if(nombreComando.equals("cliente"))
				{
					comandos.add(new NewClientDataCommand(atributos.getNamedItem("tarjetaFid").getNodeValue(), atributos.getNamedItem("empleado").getNodeValue()));
				}
			}
			return true;
		} 
		catch (Exception e) 
		{
			System.out.println("Ha ocurrido un error en la lectura del fichero");
			return false;
		}
	}
	
	@Override
	public VentaEntrada getVenta(String origen)
	{
		VentaEntrada salida = new VentaEntrada();
	
		boolean lectura = getComandos(origen);
		
		if (lectura)
		{
			//Para cada comando del XML, ejecutar el comando que toque, que los guardas en un arrayList de comandos
			for (Command c: comandos)
			{
				c.execute(salida);
			}
		}
		else // Si no se ha podido leer el fichero, haz como si la venta se hubiera cancelado
		{
			salida.setCancelledStatus(true);
		}
		
		return salida;
	}
}
